/**
 * 
 */
package br.com.consultsystems.negocio.impl.financeiro;

import java.math.BigDecimal;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import org.apache.log4j.Logger;

import br.com.consultsystems.dominio.financeiro.Baixa;
import br.com.consultsystems.dominio.financeiro.CaixaBanco;
import br.com.consultsystems.dominio.financeiro.Titulo;
import br.com.consultsystems.dominio.tipos.StatusFinanceiro;
import br.com.consultsystems.negocio.spec.financeiro.BaixaNegocio;
import br.com.consultsystems.persistencia.spec.financeiro.BaixaPersistencia;
import br.com.consultsystems.persistencia.spec.financeiro.CaixaBancoPersistencia;
import br.com.consultsystems.persistencia.spec.financeiro.TituloPersistencia;

/**
 * @author Moralles
 *
 */
@Stateless(name = "baixaNegocio")
public class BaixaNegocioImpl implements BaixaNegocio {

	private static final Logger LOG = Logger.getLogger(BaixaNegocioImpl.class);
	
	@EJB
	private BaixaPersistencia baixaPersistencia;

	@EJB
	private TituloPersistencia tituloPersistencia;

	@EJB
	private CaixaBancoPersistencia caixaBancoPersistencia;
	
	@Override
	public Baixa merge(Baixa baixa) throws Exception {

		/* Cria o CaixaBanco */
		CaixaBanco caixaBanco = new CaixaBanco();
		caixaBanco.setBalancete(baixa.getTitulo().getCompetencia());
		caixaBanco.setCondominio(baixa.getTitulo().getCondominio());
		caixaBanco.setConta(baixa.getConta());
		caixaBanco.setDataMovimento(baixa.getDataMovimento());
		//caixaBanco.setFechamento(fechamento);
		caixaBanco.setHistoricoBalancete(baixa.getHistorico());
		caixaBanco.setObservacao(baixa.getObservacao());
		caixaBanco.setValorLancamento(baixa.getValorPago());

		/* Salva a baixa */
		baixa = baixaPersistencia.merge(baixa);
		
		/* Atualiza o título */
		Titulo titulo = baixa.getTitulo();
		tituloPersistencia.refresh(titulo);
		titulo.setSaldotitulo(titulo.getValorTitulo().subtract(baixa.getValorBaixa()));
		if(titulo.getSaldotitulo().doubleValue() == BigDecimal.ZERO.doubleValue()) {
			titulo.setStatus(StatusFinanceiro.FECHADO);
		}
		titulo = tituloPersistencia.merge(titulo);
		
		/* Salva o caixabanco */
		caixaBanco.setBaixa(baixa);
		caixaBancoPersistencia.merge(caixaBanco);
		
		return baixa;
	}

	@Override
	public Baixa retrieve(Long id) throws Exception {
		return null;
	}

	@Override
	public void remove(Baixa baixa) throws Exception {
		
		baixa = baixaPersistencia.merge(baixa);
		
		/* Veriica o caixaBanco */
		CaixaBanco caixaBanco = caixaBancoPersistencia.retrieveByBaixa(baixa);
		
		if(caixaBanco != null && caixaBanco.getFechamento() != null) {
			throw new Exception("CaixaBanco Fechado");
		} else {
			
			/* Atualiza Titulo */
			Titulo titulo = baixa.getTitulo();
			tituloPersistencia.refresh(titulo);
			titulo.setSaldotitulo(titulo.getValorTitulo());
			titulo.setStatus(StatusFinanceiro.ABERTO);
			titulo = tituloPersistencia.merge(titulo);

			/* Atualizar CaixaBanco */
			caixaBancoPersistencia.remove(caixaBanco);
			
			/* Atualizar Baixa */
			baixaPersistencia.remove(baixa);
			
		}
		
		
	}

	@Override
	public void refresh(Baixa t) throws Exception {
		baixaPersistencia.refresh(t);
	}

	@Override
	public List<Baixa> retrieveAll() throws Exception {
		return null;
	}

	@Override
	public List<Baixa> retrieveByFilter(String nomeCondominio) throws Exception {
		return baixaPersistencia.retrieveByNomeCondominio(nomeCondominio);
	}

}
